package com.xiaolun.bio;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class BIOServer {
	/**
	 * 思路：
	 * 1、创建一个线程池
	 * 2、如果有客户端连接，就创建一个线程，与之通讯（单独写一个方法）
	 */
	public static void main(String[] args) throws Exception {

		//创建一个线程池,每连接到一个客户端，就启动一个线程和客户端进行通信
		ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();

		@SuppressWarnings("resource")
		ServerSocket server = new ServerSocket(6666); // 监听6666端口
		System.out.println("tomcat服务器启动...");
		while (true) {
			//阻塞（监听）， 等待客户端连接
			final Socket socket = server.accept();
			System.out.println("连接到一个客户端");
			newCachedThreadPool.execute(new Runnable() {
				@Override
				public void run() {
					//业务处理
					handler(socket);
				}
			});
		}

	}

	/**
	 * 处理-编写一个handler方法，和客户端通讯
	 *
	 * @param socket
	 */
	public static void handler(Socket socket) {
		try {
			byte[] bytes = new byte[1024];
			InputStream inputStream = socket.getInputStream();

			while (true) {
				//（循环）读客户端数据 阻塞-将数据读取到bytes
				int read = inputStream.read(bytes);
				if (read != -1) {
					//将字节数组从下标为0的位置进行转换成string进行输出
					System.out.println(new String(bytes, 0, read));
				} else {
					break;
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				System.out.println("关闭和client的连接..");
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
